﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Mail;
using System.Web;
using System.Web.Mvc;
using EFDataModel;

namespace ContactManagement.AppCode.MailManagement
{
    /// <summary>
    /// Wenn ein neuer User erstellt wird, dann kann der Admin hier kein PW selbst festlegen, sondern kann dem User nur sein neues automatisch generiertes PW zusenden lassen.
    /// </summary>
    public class AddUserMail
    {
        #region Properties
        /// <summary>
        /// Der Aktuelle Controller um z.b. Messages darstellen zu können
        /// </summary>
        private Controller CurrentController { get; set; }
        #endregion

        #region Konstruktor
        /// <summary>
        /// Initialisieren der Klasse
        /// </summary>
        /// <param name="controller">Der Aktuelle Controller</param>
        public AddUserMail(Controller controller)
        {
            CurrentController = controller;
        }
        #endregion

        #region Public Functions
        /// <summary>
        /// Erstellen des Passwortes für den User und Ihm per mail zusenden
        /// </summary>
        /// <param name="userId">Die UserId für die das PW erstellt und zugesendet werden soll</param>
        /// <returns>TRUE->Zusenden erfolgreich | FALSE->Fehler beim Zusenden</returns>
        public bool SendUserPasswordMail(int userId)
        {
            //Laden des Users anhand seiner Id aus der Datenbank
            EFUser efUser = (EFUser)CurrentHttpContext.GetDataModel().EFBaseMenge.Find(userId);
            if (efUser != null)
            {
                //Erstellen des neuen Passworts und Speichern des Users mit dem neuen Passwort.
                string randomPassword = Common.Password.PasswordHash.GetRandomString(WebConstants.PasswordLength, true);
                efUser.SetPassword(randomPassword);
                CurrentHttpContext.GetDataModel().SaveChanges();

                try
                {
                    //Zusammenbauen der passenden Maildaten
                    string mailMessage = string.Format(App_GlobalResources.Mailformulars.AddUserCreatePasswortMailRESX, efUser.LoginEmail, randomPassword);
                    string subject = string.Format(App_GlobalResources.Mailformulars.AddUserCreatePasswortSubjectRESX, efUser.GetFullName());

                    MailMessage message = new MailMessage();
                    message.Subject = subject;
                    message.Body = mailMessage;
                    message.To.Add(new MailAddress(efUser.LoginEmail));

                    //Der SMTP Client liest die Mail Credentials direkt aus der Web.Config aus.
                    SmtpClient client = new SmtpClient();
                    client.Send(message);

                    //Bestätigungsmeldung das das passwort erfolgreich versendet wurde.
                    CustomMessage.CurrentMessage(CurrentController).AddMessage(App_GlobalResources.SystemMessages.NewPasswordCreatedAddUserRESX,MessageTypes.ok);

                    return true;
                }
                catch (Exception ex)
                {
                    EFDebugging.Debugging.WriteLog("SendMail für SendUserPasswordMail: ", ex);
                    CustomMessage.CurrentMessage(CurrentController).AddMessage(App_GlobalResources.SystemMessages.ErrorPleaseTryAgainLaterRESX,MessageTypes.error);
                }

            }
            else
            {
                //Der Benutzer existiert nicht Fehlermeldung zurückgeben
                CustomMessage.CurrentMessage(CurrentController).AddMessage(App_GlobalResources.SystemMessages.UserDontExistsErrorRESX, MessageTypes.error);
            }

            return false;
        }
        #endregion
    }
}